/*
 * Copyright 2023 Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 */
#include <OS.h>

#include <arch_cpu.h>
#include <libroot_private.h>
#include <real_time_data.h>

// 转换因子，用于将CPU时间计数器值转换为微秒
static uint64_t cv_factor = 0;

// 设置系统时间转换因子
extern "C" void
__loongarch64_setup_system_time(uint64_t cv)
{
    cv_factor = cv;
}

// 获取CPU时间计数器值
static inline uint64_t
read_cpu_time(void)
{
    uint64_t time;
    // 使用龙芯的RDTIME.D指令读取时间计数器
    asm volatile("rdtime.d %0" : "=r"(time));
    return time;
}

// 系统时间函数，返回自启动以来的微秒数
bigtime_t
system_time(void)
{
    // 如果转换因子未初始化，返回0
    if (cv_factor == 0)
        return 0;

    // 读取CPU时间计数器并转换为微秒
    // 使用128位乘法避免溢出
    __uint128_t time = static_cast<__uint128_t>(read_cpu_time()) * cv_factor;
    return time >> 32;
}